///////////////////////////////////////////////////////////////////////////////
// File:        PlayerManager.hpp
// Author:      671643387@qq.com
// Description: 
///////////////////////////////////////////////////////////////////////////////

#if !defined(SHARED_PLAYER_PLAYERMANAGER_HPP_)
#define SHARED_PLAYER_PLAYERMANAGER_HPP_

#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif

#include <boost/noncopyable.hpp>
#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <boost/unordered_map.hpp>

#include "player/Player.hpp"

///////////////////////////////////////////////////////////////////////////////
class PlayerManager : public boost::noncopyable
{
public:
    ///////////////////////////////////////////////////////////////////////////
    PlayerManager(void);
    ~PlayerManager(void);

public:
    ///////////////////////////////////////////////////////////////////////////
    bool Open(std::string address, short port, int backlog);
    int Run(void);
    void Stop(void);

    ///////////////////////////////////////////////////////////////////////////
    void ClosePlayer(int id);

protected:
    ///////////////////////////////////////////////////////////////////////////
    virtual PlayerPtr CreatePlayer(void);

private:
    ///////////////////////////////////////////////////////////////////////////
    bool _PostAccept(void);

    void _OnAccept(socket_ptr sock, const boost::system::error_code& err);

private:
    ///////////////////////////////////////////////////////////////////////////
    typedef boost::unordered_map<int, PlayerPtr>    PlayerMap;

private:
    ///////////////////////////////////////////////////////////////////////////
    boost::asio::io_service         iosev_;
    boost::asio::ip::tcp::acceptor  acceptor_;

    int                             playerIDGen_;
    PlayerMap                       players_;
    boost::mutex                    playerLock_;
};

#endif //SHARED_PLAYER_PLAYERMANAGER_HPP_
